package ContentManager;

##########################
#     OmnibusProxy       #
#    Krzysztof Ulman     #
# Politechnika Krakowska #
#      Kraków 2012       #
##########################

use strict;
use warnings;
use encoding 'utf8';

use HTML::TreeBuilder;
use ResultObject;
use URI;

#podstawowy adres wyszukiwarki - potrzebny do tworzenia adresow bezwzgledych
#my $baseUrl;

#drzewo zbudowane ze kodu HTML
#my $contentTree;

#adres URL do nastepnej strony z wynikami wyszukiwania
#my $nextPageUrl;

#lista wynikow wyszukiwania
#my @resultList;

#konstruktor
sub new {
	shift;
	my $self = {};
	bless $self;
	
	my $baseUrl = shift;
	
	$self->{baseUrl} = $baseUrl;
	$self->{nextPageUrl} = '';
	$self->{resultPosition} = 0;
	
	return $self;
}

sub doWork {
	my $self = shift;
	
	#utworzenie drzewa HTML
	my $content = shift;
	my $contentTree	= HTML::TreeBuilder->new_from_content($content);
	$self->{contentTree} = $contentTree; 
	
	#wyszukanie informacji na stronie
	private_findUlListsAndCompute($self);
	#usuniecie
	private_del($self);
}

#destruktor
sub private_del {
	my $self = shift;
	
	#usuniecie powiazan z drzewa HTML, aby GC mogl posprzatac
	my $contentTree = $self->{contentTree};
	$contentTree->delete();
}

#wyszukuje listy i dokonuje ich analizy
sub private_findUlListsAndCompute {
	my $self = shift;
	my $contentTree = $self->{contentTree};
	
	#lista wynikow
	my @uls = $contentTree->find_by_tag_name('ul', 'ol');
	my $lisId = 0;
	my $maxLisNumber = 0;
	my $maxLisId = -1;
	foreach my $ul (@uls) {
		my @lis = $ul->find_by_tag_name('li');
		my $lisNumber = @lis;
		if($lisNumber > $maxLisNumber) {
			$maxLisNumber = $lisNumber;
			$maxLisId = $lisId; 
		}
		$lisId++;
	}
	
	if($maxLisId > -1) {
		my $resultUl = $uls[$maxLisId];
		private_findResult($self, $resultUl);
	}

	#link do nastepnej strony
	my @hrefs = $contentTree->find_by_tag_name('a');
	if(scalar(@hrefs) > 0) {
		foreach my $href (@hrefs) {
			my $hrefText = $href->as_text();
			if($hrefText =~ /^Następna/ || $hrefText =~ /^Next/) {
				my $nextPageUrl = $href->attr('href'); #TODO czy nie trzeba dolozyc roota?
				$self->{nextPageUrl} = $nextPageUrl;
				last; #taki break;
			}
		}
	}
}

sub private_findResult {
	my $self = shift;
	my $resultUl = shift;
	my @resultList;
	
	my @lis = $resultUl->find_by_tag_name('li');
	foreach my $li (@lis) {
		my @hrefs = $li->find_by_tag_name('a');
		if(scalar(@hrefs) > 0) {
			my $href = $hrefs[0]; #TODO poprawic
			my $title = $href->as_text();
			my $url = $href->attr('href');
			#odczytanie pozycji
			$self->{resultPosition}++;
			my $resultPosition = $self->{resultPosition};
			#przygotowanie obiektu
			if($title ne '') {
				my $resultObject = ResultObject->new($title, $url, $resultPosition);
				push(@resultList, $resultObject);
			}
		}
	}
	
	$self->{resultList}	= \@resultList;
}

#sub private_findNextPageUrl {
#	my $self = shift;
#	my $hrefs = shift;
#	foreach my $href (@hrefs) {
#		$href->as_text
#	}
#}

#zwraca adres do nastepnej strony
sub getNextPageUrl {
	my $self = shift;
	my $nextPageUrl = $self->{nextPageUrl};
	if($nextPageUrl ne '') {
		$nextPageUrl = private_getAbsoluteUrl($self, $nextPageUrl);
	}
	return $nextPageUrl;
}

#zamienia adres ew. adres wzgledny na bezwzgledny
sub private_getAbsoluteUrl {
	my $self = shift;
	my $nextPageUrl = shift;
	my $baseUrl = $self->{baseUrl};
	if($baseUrl) {
		return URI->new_abs($nextPageUrl, $baseUrl);
	} else {
		return $nextPageUrl;
	}
}

#zwraca liste wynikow wyszukiwania
sub getResultList {
	my $self = shift;
	return $self->{resultList};
}

#zwraca licze obiektow na liscie wynikowej
sub getResultsNumber {
	my $self = shift;
	my @resultList = $self->{resultList};
	my $number = @resultList;
	return $number;
}

1;